package com.rop.znyx.search.service.Impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.rop.znyx.common.auth.AuthContextHolder;
import com.rop.znyx.product.ProductFeignClient;
import com.rop.znyx.enums.SkuType;
import com.rop.znyx.model.product.Category;
import com.rop.znyx.model.product.SkuInfo;
import com.rop.znyx.model.search.SkuEs;
import com.rop.znyx.search.repository.SkuEsRepository;
import com.rop.znyx.search.service.SkuService;
import com.rop.znyx.vo.search.SkuEsQueryVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * Created with IntelliJ IDEA
 * User: Rop
 * Date: 2023/6/30
 * Time: 17:47
 * Description:
 */

@Slf4j
@Service
@RequiredArgsConstructor
public class SkuServiceImpl implements SkuService {

    private final SkuEsRepository skuEsRepository;

    private final ProductFeignClient productFeignClient;

    private final RestHighLevelClient restHighLevelClient;

    private final RedisTemplate<Object, Object> redisTemplate;

    /**
     * 上架商品列表
     */
    @Override
    public void upperSku(Long skuId) {
        log.info("upperSku" + skuId);
        SkuEs skuEs = new SkuEs();

        // 查询sku信息
        SkuInfo skuInfo = productFeignClient.getSkuInfo(skuId).getData();
        if (ObjUtil.isNull(skuInfo)) {
            return;
        }

        // 查询sku分类
        Category category = productFeignClient.getCategory(skuInfo.getCategoryId()).getData();
        if (ObjUtil.isNotNull(category)) {
            skuEs.setCategoryId(category.getId());
            skuEs.setCategoryName(category.getName());
        }
        skuEs.setId(skuInfo.getId());
        skuEs.setKeyword(skuInfo.getSkuName() + "," + skuEs.getCategoryName());
        skuEs.setWareId(skuInfo.getWareId());
        skuEs.setIsNewPerson(skuInfo.getIsNewPerson());
        skuEs.setImgUrl(skuInfo.getImgUrl());
        skuEs.setTitle(skuInfo.getSkuName());
        if (ObjectUtil.equal(skuInfo.getSkuType(), SkuType.COMMON.getCode())) {
            skuEs.setSkuType(0);
            skuEs.setPrice(skuInfo.getPrice().doubleValue());
            skuEs.setStock(skuInfo.getStock());
            skuEs.setSale(skuInfo.getSale());
            skuEs.setPerLimit(skuInfo.getPerLimit());
        } else {
            //TODO 待完善-秒杀商品

        }
        SkuEs save = skuEsRepository.save(skuEs);
        log.info("upperSku：" + JSON.toJSONString(save));

    }

    /**
     * 下架商品列表
     */
    @Override
    public void lowerSku(Long skuId) {
        this.skuEsRepository.deleteById(skuId);
    }

    /**
     * 查询上架商品
     */
    @Override
    public List<SkuEs> findHotSkuList() {
        Pageable pageable = PageRequest.of(0, 10);
        List<SkuEs> content = skuEsRepository.findByOrderByHotScoreDesc(pageable).getContent();
        Iterable<SkuEs> all = skuEsRepository.findAll();
        return ListUtil.toList(all);
    }

    @Override
    public Page<SkuEs> search(Pageable pageable, SkuEsQueryVo skuEsQueryVo) {
        // 1.向SkuEsQueryVo设置wareId，当前登录用户的仓库id
        Long wareId = AuthContextHolder.getWareId();
        skuEsQueryVo.setWareId(wareId);

        // 2.查询，调用skuEsRepository，根据springData命名规则定义方法，进行条件查询
        Page<SkuEs> pageModel = null;
        // 判断keyword是否为空，如果为空，根据仓库id + 分类id查询
        Long categoryId = skuEsQueryVo.getCategoryId();
        String keyword = skuEsQueryVo.getKeyword();
        if (StrUtil.isBlank(keyword)) {
            pageModel = skuEsRepository.findByCategoryIdAndWareId(categoryId, wareId, pageable);
        } else {
            // 如果不为空，根据仓库id + keyword进行查询
            pageModel = skuEsRepository.findByKeywordAndWareId(keyword, wareId, pageable);
        }

        // 3.查询商品参加优惠活动
        List<SkuEs> skuEsList = pageModel.getContent();
        if (CollUtil.isNotEmpty(skuEsList)) {
            // 得到所有的skuId
            List<Long> skuIdList = skuEsList.stream().map(SkuEs::getId).collect(toList());

            // 根据skuId的列表远程调用，调用service-activity里面的接口得到数据
            // 返回Map<Long,List<String>>
            // map集合key就是skuId值，Long类型
            // map集合中的value是list集合
            // 一个商品参加一个活动，一个活动里面可以有多个规则
            Map<Long, List<String>> skuIdToRuleListMap = null;

            // 封装获取数据到skuEs里面的ruleList里面

        }


        return pageModel;
    }

    @Override
    public void incrHotScore(Long skuId) {
        // 定义key
        String hotKey = "hotScore";
        // 保存数据
        Double hotScore = redisTemplate.opsForZSet().incrementScore(hotKey, "skuId:" + skuId, 1);
        if (hotScore % 10 == 0) {
            // 更新es
            Optional<SkuEs> optional = skuEsRepository.findById(skuId);
            SkuEs skuEs = optional.get();
            skuEs.setHotScore(Math.round(hotScore));
            skuEsRepository.save(skuEs);
        }
    }
}
